home *** CD-ROM | disk | FTP | other *** search
/ AmigActive 10 / AACD 10.iso / AACD / Games / MAME / src / vidhrdw / munchmo.c < prev    next >
C/C++ Source or Header  |  2000-05-25  |  5KB  |  212 lines

  1. #include "driver.h"
  2. #include "vidhrdw/generic.h"
  3.  
  4.  
  5. UINT8 *mnchmobl_vreg;
  6. UINT8 *mnchmobl_status_vram;
  7. UINT8 *mnchmobl_sprite_xpos;
  8. UINT8 *mnchmobl_sprite_attr;
  9. UINT8 *mnchmobl_sprite_tile;
  10.  
  11. static int mnchmobl_palette_bank;
  12. static int flipscreen;
  13.  
  14. void mnchmobl_convert_color_prom(unsigned char *palette, unsigned short *colortable,const unsigned char *color_prom)
  15. {
  16.     int i;
  17.  
  18.     for (i = 0;i < Machine->drv->total_colors;i++)
  19.     {
  20.         int bit0,bit1,bit2;
  21.  
  22.         /* red component */
  23.         bit0 = (*color_prom >> 0) & 0x01;
  24.         bit1 = (*color_prom >> 1) & 0x01;
  25.         bit2 = (*color_prom >> 2) & 0x01;
  26.         *(palette++) = 0x21 * bit0 + 0x47 * bit1 + 0x97 * bit2;
  27.         /* green component */
  28.         bit0 = (*color_prom >> 3) & 0x01;
  29.         bit1 = (*color_prom >> 4) & 0x01;
  30.         bit2 = (*color_prom >> 5) & 0x01;
  31.         *(palette++) = 0x21 * bit0 + 0x47 * bit1 + 0x97 * bit2;
  32.         /* blue component */
  33.         bit0 = (*color_prom >> 6) & 0x01;
  34.         bit1 = (*color_prom >> 7) & 0x01;
  35.         *(palette++) = 0x4f * bit0 + 0xa8 * bit1;
  36.  
  37.         color_prom++;
  38.     }
  39. }
  40.  
  41. WRITE_HANDLER( mnchmobl_palette_bank_w )
  42. {
  43.     if( mnchmobl_palette_bank!=(data&0x3) )
  44.     {
  45.         memset( dirtybuffer, 1, 0x100 );
  46.         mnchmobl_palette_bank = data&0x3;
  47.     }
  48. }
  49.  
  50. WRITE_HANDLER( mnchmobl_flipscreen_w )
  51. {
  52.     if( flipscreen!=data )
  53.     {
  54.         memset( dirtybuffer, 1, 0x100 );
  55.         flipscreen = data;
  56.     }
  57. }
  58.  
  59.  
  60. READ_HANDLER( mnchmobl_sprite_xpos_r ){ return mnchmobl_sprite_xpos[offset]; }
  61. WRITE_HANDLER( mnchmobl_sprite_xpos_w ){ mnchmobl_sprite_xpos[offset] = data; }
  62.  
  63. READ_HANDLER( mnchmobl_sprite_attr_r ){ return mnchmobl_sprite_attr[offset]; }
  64. WRITE_HANDLER( mnchmobl_sprite_attr_w ){ mnchmobl_sprite_attr[offset] = data; }
  65.  
  66. READ_HANDLER( mnchmobl_sprite_tile_r ){ return mnchmobl_sprite_tile[offset]; }
  67. WRITE_HANDLER( mnchmobl_sprite_tile_w ){ mnchmobl_sprite_tile[offset] = data; }
  68.  
  69. void mnchmobl_vh_stop( void )
  70. {
  71.     if( tmpbitmap ) osd_free_bitmap( tmpbitmap );
  72.     free( dirtybuffer );
  73. }
  74.  
  75. int mnchmobl_vh_start( void )
  76. {
  77.     dirtybuffer = malloc(0x100);
  78.     tmpbitmap = osd_create_bitmap(512,512);
  79.     if( dirtybuffer && tmpbitmap )
  80.     {
  81.         memset( dirtybuffer, 1, 0x100 );
  82.         return 0;
  83.     }
  84.     mnchmobl_vh_stop();
  85.     return 1;
  86. }
  87.  
  88. READ_HANDLER( mnchmobl_videoram_r )
  89. {
  90.     return videoram[offset];
  91. }
  92.  
  93. WRITE_HANDLER( mnchmobl_videoram_w )
  94. {
  95.     offset = offset&0xff; /* mirror the two banks? */
  96.     if( videoram[offset]!=data )
  97.     {
  98.         videoram[offset] = data;
  99.         dirtybuffer[offset] = 1;
  100.     }
  101. }
  102.  
  103. static void draw_status( struct osd_bitmap *bitmap )
  104. {
  105.     struct rectangle clip = Machine->drv->visible_area;
  106.     const struct GfxElement *gfx = Machine->gfx[0];
  107.     int row;
  108.  
  109.     for( row=0; row<4; row++ )
  110.     {
  111.         int sy,sx = (row&1)*8;
  112.         const unsigned char *source = mnchmobl_status_vram + (row&1)*32;
  113.         if( row<=1 )
  114.         {
  115.             source+=2*32;
  116.             sx+=256+32+16;
  117.         }
  118.         for( sy=0; sy<256; sy+=8 )
  119.         {
  120.             drawgfx( bitmap, gfx,
  121.                 *source++,
  122.                 0, /* color */
  123.                 0,0, /* no flip */
  124.                 sx,sy,
  125.                 &clip,
  126.                 TRANSPARENCY_NONE, 0 );
  127.         }
  128.     }
  129. }
  130.  
  131. static void draw_background( struct osd_bitmap *bitmap )
  132. {
  133. /*
  134.     ROM B1.2C contains 256 tilemaps defining 4x4 configurations of
  135.     the tiles in ROM B2.2B
  136. */
  137.     unsigned char *tile_data = memory_region(REGION_GFX2);
  138.     const struct GfxElement *gfx = Machine->gfx[1];
  139.     int offs;
  140.  
  141.     for( offs=0; offs<0x100; offs++ )
  142.     {
  143.         if( dirtybuffer[offs] )
  144.         {
  145.             int sy = (offs%16)*32;
  146.             int sx = (offs/16)*32;
  147.             int tile_number = videoram[offs];
  148.             int row,col;
  149.             dirtybuffer[offs] = 0;
  150.             for( row=0; row<4; row++ )
  151.             {
  152.                 for( col=0; col<4; col++ )
  153.                 {
  154.                     drawgfx( tmpbitmap,gfx,
  155.                         tile_data[col+tile_number*4+row*0x400],
  156.                         mnchmobl_palette_bank,
  157.                         0,0, /* flip */
  158.                         sx+col*8, sy+row*8,
  159.                         0, TRANSPARENCY_NONE, 0 );
  160.                 }
  161.             }
  162.         }
  163.     }
  164.  
  165.     {
  166.         int scrollx = -(mnchmobl_vreg[6]*2+(mnchmobl_vreg[7]>>7))-64-128-16;
  167.         int scrolly = 0;
  168.  
  169.         copyscrollbitmap(bitmap,tmpbitmap,
  170.             1,&scrollx,1,&scrolly,
  171.             &Machine->drv->visible_area,TRANSPARENCY_NONE,0);
  172.     }
  173. }
  174.  
  175. static void draw_sprites( struct osd_bitmap *bitmap )
  176. {
  177.     const struct rectangle *clip = &Machine->drv->visible_area;
  178.     int scroll = mnchmobl_vreg[6];
  179.     int flags = mnchmobl_vreg[7];                    /*   XB?????? */
  180.     int xadjust = - 128-16 - ((flags&0x80)?1:0);
  181.     int bank = (flags&0x40)?1:0;
  182.     const struct GfxElement *gfx = Machine->gfx[2+bank];
  183.     int color_base = mnchmobl_palette_bank*4+3;
  184.     int i;
  185.     for( i=0; i<0x200; i++ )
  186.     {
  187.         int tile_number = mnchmobl_sprite_tile[i];    /*   ETTTTTTT */
  188.         int attributes = mnchmobl_sprite_attr[i];    /*   XYYYYYCC */
  189.         int sx = mnchmobl_sprite_xpos[i];            /*   XXXXXXX? */
  190.         int sy = (i/0x40)*0x20;                        /* Y YY------ */
  191.         sy += (attributes>>2)&0x1f;
  192.         if( tile_number != 0xff && (attributes&0x80) )
  193.         {
  194.             sx = (sx>>1) | (tile_number&0x80);
  195.             sx = 2*((-32-scroll - sx)&0xff)+xadjust;
  196.             drawgfx( bitmap, gfx,
  197.                 0x7f - (tile_number&0x7f),
  198.                 color_base-(attributes&0x03),
  199.                 0,0, /* no flip */
  200.                 sx,sy,
  201.                 clip, TRANSPARENCY_PEN, 7 );
  202.         }
  203.     }
  204. }
  205.  
  206. void mnchmobl_vh_screenrefresh(struct osd_bitmap *bitmap,int full_refresh)
  207. {
  208.     draw_background( bitmap );
  209.     draw_sprites( bitmap );
  210.     draw_status( bitmap );
  211. }
  212.